import fp from 'lodash/fp';
/**
 * splitPrice的返回值
 * @interface ISplitPriceResult
 */
interface ISplitPriceResult {
  /** 原始的价格 */
  price: string | number,
  /** 整数部分 */
  integer: string,
  /** 小数部分 */
  decimal: string,
  /** 小数部分没有小数点部分 */
  decimalNoPoint: string,
  /** 整数加小数部分 */
  priceFixed: string,
}

/**
 *
 * 格式化价格，返回一个对象，包含原始的价格、整数部分、小数部分、小数部分没有小数点部分、整数加小数部分。
 * 如果想要保留合适的小数位数请在调用该方法之前处理好
 * @export
 * @since 1.0.9
 * @example splitPrice(1.2)
 * // 输出为
 * {
      price: 1.2,
      integer: '1',
      decimal: '.2',
      decimalNoPoint: '2',
      priceFixed: '1.2',
    }
 * @param {(number | string)} price 价格
 * @return {ISplitPriceResult} 包含原始的价格、整数部分、小数部分、小数部分没有小数点部分、整数加小数部分的对象
 */
export default function splitPrice(price?: number | string): ISplitPriceResult {
  // 参数校验
  if ((typeof price !== 'number' && typeof price !== 'string')) {
    return {
      price: '',
      integer: '',
      decimal: '',
      decimalNoPoint: '',
      priceFixed: '',
    };
  }
  // 整数部分
  const integer = `${parseInt(`${price}`, 10)}`;
  // 小数部分
  const decimal = `.${fp.flowRight(
    fp.defaultTo(''),
    fp.at(1),
    fp.split('.'),
  )(`${price}`)}`;
  // 小数部分没有小数点
  const decimalNoPoint = fp.trimCharsStart('.', decimal);
  return {
    price,
    integer,
    decimal,
    decimalNoPoint,
    priceFixed: fp.trimCharsEnd('.', `${integer}${decimal}`),
  };
}
